class Student:
    def __init__(self, name, age):
        self.name = name  # 公开属性 public
        self._nickname = name  # 受保护属性 protected
        self.__realname = name  # 私有属性 private
        self.age = age
        self._age = age
        self.__age = age

    def getAge(self):
        return self.age

    @property
    def getAgeByProperyDecoroate(self):
        return self.age

    # 定义属性设置器
    @getAgeByProperyDecoroate.setter
    def getAgeByProperyDecoroate(self, newValue):
        if isinstance(newValue, int):
            self.age = newValue
        else:
            raise ValueError("设置的值必须为int类型")


# 创建实例
stu = Student("小明", 20)

# 公开属性，直接访问
print(stu.name)  # 小明
stu.name = "小红"
print(stu.name)  # 小红

# 受保护属性（实际能访问，但约定不要在类外直接访问）
print(stu._nickname)  # 小明
stu._nickname = "小亮"
print(stu._nickname)  # 小亮

# 私有属性，不能直接访问
# print(stu.__realname)  # AttributeError，不能直接访问

# 可以通过特殊方式访问私有属性（不推荐）
print(stu._Student__realname)  # 小明


print("通过类的实列方法获得属性值", stu.getAge())
print("通过@propery属性装饰器，把方法变成属性=", stu.getAgeByProperyDecoroate)

stu.getAgeByProperyDecoroate = 100
print(stu.getAgeByProperyDecoroate)


class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def area(self):
        return 3.14 * self._radius**2

    # 属性设置器要@area，要和属性同名
    @area.setter
    def area(self, new_value):
        self._radius = new_value


c = Circle(2)
print(c.area)  # 12.56
c.area = 10  # 报错：只读属性
